class Vue {
  constructor (options) {
    // 1、存储属性
    this.options = options || {}
    this.$data = options.data || {}
    // 判断el值得类型，并进行相应处理
    const { el } = options
    typeof el === 'string' ? document.querySelector(el) : el
    
    // 2、将data注入到Vue实例中
    _proxyData (this, this.$data) 

    // 3 创建Observer实例监视data的属性变化
    new Observer(this.$data)

    // 调用Compiler
    new Compiler(this)
  }
}

// 将data属性注入到vue实例
function _proxyData (target, data) {
  Object.keys(data).forEach(key => {
    Object.defineProperty(target, key, {
      enumerable: true,
      configurable: true,
      get () {
        return data[key]
      },
      set (newValue) {
        data[key] = newValue
      }
    })
  })
}